<template>
  <img alt="Vue logo" src="./assets/logo.png" />
  <hr />
  计数器：{{ count }} <button @click="count++">+1</button>
  <hr />
  <p>姓名：{{ user.name }} <button @click="user.name = 'tom'">改名</button></p>
  <p>性别：{{ user.info.gender }}</p>
  <p>
    年龄：{{ user.info.age }} <button @click="user.info.age++">过了一年</button>
  </p>
</template>

<script>
import { reactive, ref, watch } from "vue";
export default {
  name: "App",
  setup() {
    // 1. 使用 watch 函数监听一个响应式数据
    // const count = ref(0);
    // // 第一个参数：响应式数据，第二个参数：数据改变后执行的函数
    // watch(count, () => {
    //   console.log("count 改变了");
    // });

    const count = ref(0);
    const user = reactive({
      name: "jack",
      info: {
        gender: "男",
        age: 18,
      },
    });
    // 2. 使用watch 函数监听多个响应式数据
    // 第一个参数是数组：可以传入多个响应式数据，第二个参数：数据改变后执行的函数
    // watch([count, user], () => {
    //   console.log('count或者user改变了')
    // });

    // 3. 监听对象中的某一个属性，属性值类型：简单数据类型
    // vue2 watch 选项里头： 'user.name': function () {}
    // 第一个参数是：一个函数返回你想监听的 对象.属性，第二个参数：数据改变后执行的函数
    // watch(
    //   () => user.name,
    //   () => {
    //     console.log('user.name 改变了')
    //   }
    // );

    // 4. 监听对象中的某一个属性，属性值类型：复杂数据类型，开启深度监听。
    // 第一个参数是：一个函数返回你想监听的 对象.属性
    // 第二个参数：数据改变后执行的函数
    // 第三个参数：侦听器的配置对象
    // watch(
    //   () => user.info,
    //   () => {
    //     console.log('user.info 改变了')
    //   },
    //   // 开启深度监听
    //   { deep: true }
    // );

    // 5. 如果你想在定义侦听器后，立即触发回调函数
    watch(
      () => user.info,
      () => {
        console.log('user.info 改变了')
      },
      // 开启深度监听，开启初始化立即执行
      { deep: true , immediate: true}
    );

    return { count, user };
  },
};
</script>

<style>
#app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}
</style>
